当前位置:  开发笔记 > 运维 > 正文

C:做{...}而(0)?

如何解决《C:做{}而(0)?》经验,为你挑选了2个好方法。

do while是一个常见的约定,它使得宏需要像标准c函数一样的尾随半冒号.除此之外,它只是确保已释放的变量设置为NULL,以便将来任何释放它的调用都不会导致错误.



1> jon..:
do { stuff() } while(0);

正在做与stuff()完全相同的事情.那么有什么大不了的呢?问题在于宏的语法.假设我们将宏定义为:

#define SAFE_FREE(x) if ((x) != NULL) { free(x); x=NULL; }

然后,有两个问题.第一个是相对较小的:使用SAFE_FREE不再需要尾部分号.更重要的是,代码如下:

if (...)
  SAFE_FREE(x)
else
   stuff();

将扩展为:

if (...)
  if ((x) != NULL) {
    free(x);
    x = NULL;
  } else
    stuff();

如上所述定义宏可以防止出现如上所述的奇怪行为,因为do { ... } while(0)行为就像没有分号的语句一样.


@Jason Coo:嗯......是的.验证了一个简单的例子,有和没有"do {...} while(0);" 包装器,带-O0和默认选项.gcc给了我完全相同的输出.(4.3.2,Debian 4.3.2-1.1,关于Debian lenny.)

2> Nick Van Bru..:

do while是一个常见的约定,它使得宏需要像标准c函数一样的尾随半冒号.除此之外,它只是确保已释放的变量设置为NULL,以便将来任何释放它的调用都不会导致错误.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有